package main

import "fmt"

// 结构体实现多接口

type Anymal interface {
	GetName() string
	SetName(name string)
}
type Animal interface {
	speak()
}

type dog struct {
	name string
}

func (d dog) GetName() string {
	return d.name
}
func (d *dog) SetName(name string) {
	d.name = name
}
func (d dog) speak() {
	fmt.Println("汪汪汪")
}
func (d dog) SetName1(name string) {
	d.name = name
}

// 接口嵌套
type Say interface {
	say()
}
type Move interface {
	move()
}
type Animal1 interface {
	Say
	Move
}
type cat struct {
}

func (c cat) say() {
	fmt.Println("喵喵喵")
}
func (c cat) move() {
	fmt.Println("跑快快")
}

func main() {
	d := &dog{"哈士奇"}  // ==> 持有所有为接收者的方法
	var d1 Anymal = d // == > 仅持有接口方法
	var d2 Animal = d
	fmt.Println(d.GetName()) // 哈士奇

	d1.SetName("二哈")
	fmt.Println(d1.GetName()) // 二哈
	d.SetName1("鸡毛")
	fmt.Println(d1.GetName())         // 二哈
	fmt.Printf("%v --- %T\n", d1, d1) // &{二哈} --- *main.dog
	fmt.Println(d1.GetName())         // 二哈
	d2.speak()                        // 汪汪汪

	// 接口嵌套的实现
	var c1 Animal1 = &cat{}
	c1.move() // 跑快快
	c1.say()  // 喵喵喵
}
